package com.intelligent.system.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 浮点运算工具类
 */
public class DecimalUtils {
    private static final int DEFAULT_SCALE = 2;
    private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP;

    /**
     * 加法运算
     */
    public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
        return v1.add(v2);
    }

    /**
     * 减法运算
     */
    public static BigDecimal subtract(BigDecimal v1, BigDecimal v2) {
        return v1.subtract(v2);
    }

    /**
     * 乘法运算
     */
    public static BigDecimal multiply(BigDecimal v1, BigDecimal v2) {
        return v1.multiply(v2);
    }

    /**
     * 除法运算
     */
    public static BigDecimal divide(BigDecimal v1, BigDecimal v2) {
        return divide(v1, v2, DEFAULT_SCALE);
    }

    /**
     * 除法运算（指定精度）
     */
    public static BigDecimal divide(BigDecimal v1, BigDecimal v2, int scale) {
        if (v2.compareTo(BigDecimal.ZERO) == 0) {
            throw new ArithmeticException("除数不能为0");
        }
        return v1.divide(v2, scale, DEFAULT_ROUNDING_MODE);
    }

    /**
     * 四舍五入
     */
    public static BigDecimal round(BigDecimal value) {
        return round(value, DEFAULT_SCALE);
    }

    /**
     * 四舍五入（指定精度）
     */
    public static BigDecimal round(BigDecimal value, int scale) {
        return value.setScale(scale, DEFAULT_ROUNDING_MODE);
    }

    /**
     * 比较两个数是否相等
     */
    public static boolean equals(BigDecimal v1, BigDecimal v2) {
        return v1.compareTo(v2) == 0;
    }

    /**
     * 判断是否大于
     */
    public static boolean greaterThan(BigDecimal v1, BigDecimal v2) {
        return v1.compareTo(v2) > 0;
    }

    /**
     * 判断是否小于
     */
    public static boolean lessThan(BigDecimal v1, BigDecimal v2) {
        return v1.compareTo(v2) < 0;
    }

    /**
     * 判断是否大于等于
     */
    public static boolean greaterThanOrEqual(BigDecimal v1, BigDecimal v2) {
        return v1.compareTo(v2) >= 0;
    }

    /**
     * 判断是否小于等于
     */
    public static boolean lessThanOrEqual(BigDecimal v1, BigDecimal v2) {
        return v1.compareTo(v2) <= 0;
    }

    /**
     * 转换为字符串（保留指定小数位）
     */
    public static String toString(BigDecimal value) {
        return toString(value, DEFAULT_SCALE);
    }

    /**
     * 转换为字符串（保留指定小数位）
     */
    public static String toString(BigDecimal value, int scale) {
        return value.setScale(scale, DEFAULT_ROUNDING_MODE).toString();
    }
} 